﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Text.RegularExpressions;

namespace tpsmi1002
{
    public partial class frmVenteActions : Form
    {
        Transaction trans;
        ListView lvTransactions;
        int activeErrorProviders; // compteur pour connaitre combien d'error providers sont toujours visible

        public frmVenteActions(Transaction _t, ListView _lv)
        {
            InitializeComponent();
            lvTransactions = _lv;
            trans = _t;
        }

        private void frmVenteActions_Load(object sender, EventArgs e)
        {
            txtCompagnie.Text = trans.Stock.CompanyName;
            txtBourse.Text = trans.Stock.StockMarket.MarketName;
            txtSymbole.Text = trans.Stock.Symbol;
            txtPrixAchat.Text = trans.PurchasePrice.ToString();
            txtPrixVente.Text = "";
            txtQteAchat.Text = trans.Quantity.ToString();
            txtQteVente.Text = "";
            lblProfits.Text = String.Format("{0:C}", 0.00);
            lblQteRestante.Text = trans.Quantity.ToString();
        }

        // trigger validation textbox prix de vente
        private void txtPrixVente_Validated(object sender, EventArgs e)
        {
            if (IsPriceValid())
            {
                epPrix.Clear();
                SetNbrVisibleEP(-1);

                if (txtQteVente.Text != "" && IsQuantityValid())
                {
                    lblProfits.Text = String.Format("{0:C}", (double.Parse(txtPrixVente.Text, CultureInfo.InvariantCulture) * int.Parse(txtQteVente.Text)));
                }
            }
            else
            {
                epPrix.SetError(txtPrixVente, "Le prix entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger validation textbox quantite
        private void txtQteVente_Validated(object sender, EventArgs e)
        {
            if (IsQuantityValid())
            {
                epQte.Clear();
                SetNbrVisibleEP(-1);

                lblQteRestante.Text = (int.Parse(txtQteAchat.Text) - int.Parse(txtQteVente.Text)).ToString();

                if (txtPrixVente.Text != "")
                {
                    txtPrixVente_Validated(sender, e);
                }
            }
            else
            {
                epQte.SetError(txtQteVente, "La quantité entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger du bouton annuler
        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // trigger du bouton enregistrer
        private void btnVendre_Click(object sender, EventArgs e)
        {
            if (this.activeErrorProviders == 0)
                Controller.sellActions(trans, double.Parse(txtPrixVente.Text), int.Parse(txtQteVente.Text));

            MessageBox.Show("La vente a bien été enregistré!", "Succès", MessageBoxButtons.OK);
            Controller.loadListTransactions(lvTransactions);
            this.Close();
        }

        private bool IsPriceValid()
        {
            var regex = @"^\d{0,5}(\.\d{0,2})?$";

            if (txtPrixVente.Text == "")
                return false;

            if (!Regex.IsMatch(txtPrixVente.Text, regex))
                return false;

            double prix = double.Parse(txtPrixVente.Text, CultureInfo.InvariantCulture);
            if (prix <= 0.00)
                return false;

            return true;
        }

        private bool IsQuantityValid()
        {
            var regex = @"^[0-9]{0,6}$";

            if (txtQteVente.Text == "")
                return false;

            if (!Regex.IsMatch(txtQteVente.Text, regex))
                return false;

            if (int.Parse(txtQteAchat.Text) < int.Parse(txtQteVente.Text))
                return false;

            if (int.Parse(txtQteVente.Text) <= 0)
                return false;

            return true;
        }

        // fonction qui sert a connaitre le nombre d'error provider toujours visible sur la fenetre, cad qu'il y a des donnees non-valide
        private void SetNbrVisibleEP(int i)
        {
            if (i == 1)
                this.activeErrorProviders++;
            else if (i == -1 && this.activeErrorProviders > 0)
                this.activeErrorProviders--;
        }
    }
}
